

#include <stdbool.h>
#include <stdint.h>

#include <platform.h>
#include "drivers/io.h"

#ifdef USE_SOFTSPI

#include "build/build_config.h"


#include "drivers/io.h"
#include "io_impl.h"
#include "drivers/bus_spi.h"
#include "bus_spi_soft.h"


static uint16_t sckPin;
GPIO_TypeDef* sckGpio;
#define SCK_H sckGpio->BSRR = sckPin
#define SCK_L sckGpio->BRR = sckPin

static uint16_t mosiPin;
GPIO_TypeDef* mosiGpio;
#define MOSI_H mosiGpio->BSRR = mosiPin
#define MOSI_L mosiGpio->BRR = mosiPin

static uint16_t misoPin;
GPIO_TypeDef* misoGpio;
#define MISO (misoGpio->IDR & misoPin)

void softSpiInit()
{

    IO_t sck = IOGetByTag(IO_TAG(RX_SCK_PIN));
    sckPin = IO_Pin(sck);
    sckGpio = IO_GPIO(sck);
    IOConfigGPIO(sck, IO_CONFIG(GPIO_Mode_Out_PP,      GPIO_Speed_50MHz));

    IO_t mosi = IOGetByTag(IO_TAG(RX_MOSI_PIN));
    mosiPin = IO_Pin(mosi);
    mosiGpio = IO_GPIO(mosi);
    IOConfigGPIO(mosi, IO_CONFIG(GPIO_Mode_Out_PP,      GPIO_Speed_50MHz));


    IO_t miso = IOGetByTag(IO_TAG(RX_MISO_PIN));
    misoPin = IO_Pin(miso);
    misoGpio = IO_GPIO(miso);
    IOConfigGPIO(miso, IO_CONFIG(GPIO_Mode_IN_FLOATING, GPIO_Speed_50MHz));

}

uint8_t softSpiTransferByte(uint8_t byte)
{
    for (int ii = 0; ii < 8; ++ii) {
        if (byte & 0x80) {
            MOSI_H;//IOHi(IOGetByTag(dev->mosiTag));
        } else {
            MOSI_L;//IOLo(IOGetByTag(dev->mosiTag));
        }
        SCK_H;//IOHi(IOGetByTag(dev->sckTag));
        byte <<= 1;
        if (MISO) {//IORead(IOGetByTag(dev->misoTag)) == 1
            byte |= 1;
        }
        SCK_L;//IOLo(IOGetByTag(dev->sckTag));
    }
    return byte;
}
#endif
